﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Windows.Forms;

namespace Administracja
{
    public partial class OsobyFaktury : Form
    {
        private readonly int _id;
        private readonly int _idF;
        private int _nrF;
        private int _orgKop;
        private int _fCzyZero = 4;
        //private bool f_lista = false;

        public OsobyFaktury(int id, int idF)
        {
            InitializeComponent();
            _id = id;
            _idF = idF;
            Wyswietl();
        }

        private void Wyswietl()
        {
            int indexAll;
            int indexSel;

            try
            {
                indexAll = list_all.SelectedItems[0].Index;
                indexSel = list_sel.SelectedItems[0].Index;
            }
            catch
            {
                indexAll = 0;
                indexSel = 0;
            }

            list_all.Items.Clear();
            list_sel.Items.Clear();
            list_sel_c.Items.Clear();

            var reader2D = Baza.Wczytaj2D("SELECT skladniki.ID, Nazwa, Symbol, VAT, Cena FROM Skladniki JOIN faktury_skladniki ON skladniki.ID = faktury_skladniki.ID_S WHERE faktury_skladniki.ID_F = '"
                + _idF + "' ORDER BY FAKTURY_SKLADNIKI.ID");

            ListViewItem element;

            double cenaS;
            foreach (var reader1Dl in reader2D)
            {
                element = list_sel.Items.Add(reader1Dl[1]);
                element.SubItems.Add(reader1Dl[2]);
                cenaS = Math.Round(Convert.ToDouble(reader1Dl[4].Replace('.', ',')), 2);
                element = list_sel_c.Items.Add(cenaS.ToString("0.00"));
                element.SubItems.Add(reader1Dl[3].Replace('.', ','));
                element.SubItems.Add("0.00");
                element.SubItems.Add(reader1Dl[0]);
            }

            reader2D = Baza.Wczytaj2D("SELECT * FROM SKLADNIKI order by ID");
            foreach (var reader1Dl in reader2D)
            {
                element = list_all.Items.Add(reader1Dl[1]);
                element.SubItems.Add(reader1Dl[2]);
                cenaS = Math.Round(Convert.ToDouble(reader1Dl[3].Replace('.', ',')), 2);
                element.SubItems.Add(cenaS.ToString("0.00"));
                element.SubItems.Add(reader1Dl[4].Replace('.', ','));
                element.SubItems.Add(reader1Dl[0]);
            }

            var reader1D = Baza.Wczytaj1D("SELECT Metoda_platnosci, Termin_platnosci, Data, Numer FROM Faktury WHERE ID = '" + _idF + "';");
            metoda.Text = reader1D[0];
            termin.Text = reader1D[1];
            data_w.Value = DateTime.Parse(reader1D[2]);
            _nrF = int.Parse(reader1D[3]);

            LiczBrutto();

            try
            {
                list_all.Items[indexAll].Selected = true;
                list_sel.Items[indexSel].Selected = true;
                list_sel_c.Items[indexSel].Selected = true;
            }
            catch { }
        }

        private void ZapiszFakture()
        {
            double sumaB = 0;

            for (int i = 0; i < list_sel.Items.Count; i++)
            {
                sumaB += Math.Round(Convert.ToDouble(list_sel_c.Items[i].SubItems[2].Text), 2);
            }

            Baza.Zapisz("UPDATE FAKTURY SET" +
                " Data = '" + data_w.Value.ToShortDateString() +
                "', Metoda_platnosci = '" + metoda.Text +
                "', Termin_platnosci = '" + termin.Text +
                "', suma_b = '" + sumaB.ToString().Replace(",", ".") +
                "' WHERE ID = '" + _idF + "';",
                "DELETE FROM FAKTURY_SKLADNIKI WHERE ID_F = '" + _idF + "'");
            Baza.Ustaw("FAKTURY_SKLADNIKI");

            var sqlSkladniki = new List<string>();

            for (int i = 0; i < list_sel.Items.Count; i++)
            {
                sqlSkladniki.Add("INSERT INTO FAKTURY_SKLADNIKI VALUES (GEN_ID(NUMERACJA_FAKTURY_SKLADNIKI,1)" +
                    ",'" + _idF +
                    "','" + list_sel_c.Items[i].SubItems[3].Text +
                    "','" + list_sel_c.Items[i].Text.Replace(",", ".") +
                    "')");
            }

            Baza.Zapisz(sqlSkladniki.ToArray());
        }

        private void LiczBrutto()
        {
            try
            {
                for (int i = 0; i < list_sel_c.Items.Count; i++)
                {
                    double netto = Math.Round(Convert.ToDouble(list_sel_c.Items[i].Text.Replace(".", ",")), 2);
                    int vat = Convert.ToInt32(list_sel_c.Items[i].SubItems[1].Text.Replace(".", ","));
                    list_sel_c.Items[i].Text = netto.ToString("0.00");
                    list_sel_c.Items[i].SubItems[2].Text = String.Format("{0:N2}", Math.Round(netto * vat / 100 + netto, 2));
                }
            }
            catch (Exception ex)
            {
                Wyjatki.Error(ex);
            }
        }

        private string SlownieLiczba(double liczba)//liczby z przedziału 0 - 1kk-1 ze znakiem i z groszami
        {
            string liczbaS = string.Format("{0:N2}", liczba);

            string tysiace = "";
            string setki;
            string zlotych = "złotych";
            string groszy = "groszy";

            var tab = liczbaS.Split();
            string grosze = tab[tab.Length - 1].Split(',')[1];
            tab[tab.Length - 1] = tab[tab.Length - 1].Split(',')[0];

            if (liczbaS.Count() > 6)
            {
                tysiace = tab[tab.Length - 2];
                setki = tab[tab.Length - 1];

                int tysiaceI = Int32.Parse(tysiace);
                if (tysiaceI == 1) tysiace = "tysiąc ";
                else
                {
                    _fCzyZero = 0;

                    if (tysiaceI > 1 && tysiaceI < 5)
                    {
                        tysiace = Cyfry(tysiaceI) + "tysiące ";
                    }
                    else
                    {
                        tysiace = Cyfry(tysiaceI) + "tysięcy ";
                    }
                }
            }
            else
            {
                setki = tab[0];
            }


            if (setki.Substring(setki.Length - 1, 1) == "2" || setki.Substring(setki.Length - 1, 1) == "3" || setki.Substring(setki.Length - 1, 1) == "4")
            {
                try
                {
                    if (setki.Substring(setki.Length - 2, 1) != "1")
                    {
                        zlotych = "złote";
                    }
                }
                catch
                {
                    zlotych = "złote";
                }
            }

            if (grosze.Substring(grosze.Length - 1, 1) == "2" || grosze.Substring(grosze.Length - 1, 1) == "3" || grosze.Substring(grosze.Length - 1, 1) == "4")
            {
                try
                {
                    if (grosze.Substring(grosze.Length - 2, 1) != "1")
                    {
                        groszy = "grosze";
                    }
                }
                catch
                {
                    groszy = "grosze";
                }
            }

            _fCzyZero = 0;
            setki = Cyfry(int.Parse(setki));
            _fCzyZero = 0;
            grosze = Cyfry(int.Parse(grosze));

            return tysiace + setki + zlotych + " i " + grosze + groszy;
        }

        private string Cyfry(int liczba) //tylko dla liczb max 3 cyfrowych
        {
            string liczbaS;
            string ret = "";

            if (liczba < 0)
            {
                ret = "minus ";
                liczba = liczba * (-1);
            }

            if (liczba < 10)
            {
                liczbaS = liczba.ToString();

                switch (liczbaS)
                {
                    case "0":
                        if (_fCzyZero == 0) ret += "zero";
                        break;
                    case "1":
                        ret += "jeden";
                        break;
                    case "2":
                        ret += "dwa";
                        break;
                    case "3":
                        ret += "trzy";
                        break;
                    case "4":
                        ret += "cztery";
                        break;
                    case "5":
                        ret += "pięć";
                        break;
                    case "6":
                        ret += "sześć";
                        break;
                    case "7":
                        ret += "siedem";
                        break;
                    case "8":
                        ret += "osiem";
                        break;
                    case "9":
                        ret += "dziewięć";
                        break;
                }
                ret += " ";
            }

            _fCzyZero = 1;

            if (liczba > 9 && liczba < 20)
            {
                liczbaS = liczba.ToString();

                switch (liczbaS)
                {
                    case "10":
                        ret += "dziesięć";
                        liczba -= 10;
                        break;
                    case "11":
                        ret += "jedenaście";
                        liczba -= 11;
                        break;
                    case "12":
                        ret += "dwanaście";
                        liczba -= 12;
                        break;
                    case "13":
                        ret += "trzynaście";
                        liczba -= 13;
                        break;
                    case "14":
                        ret += "czternaście";
                        liczba -= 14;
                        break;
                    case "15":
                        ret += "piętnaście";
                        liczba -= 15;
                        break;
                    case "16":
                        ret += "szesnaście";
                        liczba -= 16;
                        break;
                    case "17":
                        ret += "siedemnaście";
                        liczba -= 17;
                        break;
                    case "18":
                        ret += "osiemnaście";
                        liczba -= 18;
                        break;
                    case "19":
                        ret += "dziewiętnaście";
                        liczba -= 19;
                        break;
                }
                ret += " ";
            }

            if (liczba > 19 && liczba < 100)
            {
                liczbaS = liczba.ToString();

                switch (liczbaS.Substring(0, 1))
                {
                    case "2":
                        ret += "dwadzieścia";
                        liczba -= 20;
                        break;
                    case "3":
                        ret += "trzydzieści";
                        liczba -= 30;
                        break;
                    case "4":
                        ret += "czterdzieści";
                        liczba -= 40;
                        break;
                    case "5":
                        ret += "pięćdziesiąt";
                        liczba -= 50;
                        break;
                    case "6":
                        ret += "sześćdziesiąt";
                        liczba -= 60;
                        break;
                    case "7":
                        ret += "siedemdziesiąt";
                        liczba -= 70;
                        break;
                    case "8":
                        ret += "osiemdziesiąt";
                        liczba -= 80;
                        break;
                    case "9":
                        ret += "dziewięćdziesiąt";
                        liczba -= 90;
                        break;
                }
                ret += " " + Cyfry(liczba);
            }

            if (liczba > 99 && liczba < 1000)
            {
                liczbaS = liczba.ToString();

                switch (liczbaS.Substring(0, 1))
                {
                    case "1":
                        ret += "sto";
                        liczba -= 100;
                        break;
                    case "2":
                        ret += "dwieście";
                        liczba -= 200;
                        break;
                    case "3":
                        ret += "trzysta";
                        liczba -= 300;
                        break;
                    case "4":
                        ret += "czterysta";
                        liczba -= 400;
                        break;
                    case "5":
                        ret += "pięćset";
                        liczba -= 500;
                        break;
                    case "6":
                        ret += "sześćset";
                        liczba -= 600;
                        break;
                    case "7":
                        ret += "siedemset";
                        liczba -= 700;
                        break;
                    case "8":
                        ret += "osiemset";
                        liczba -= 800;
                        break;
                    case "9":
                        ret += "dziewięćset";
                        liczba -= 900;
                        break;
                }
                ret += " " + Cyfry(liczba);
            }
            return ret;
        }

        #region handlery
        private void zapisz_Click(object sender, EventArgs e)
        {
            ZapiszFakture();
            Close();
        }

        private void podglad_Click(object sender, EventArgs e)
        {
            ZapiszFakture();

            var podgladDruku = new PrintDocument();
            podgladDruku.PrintPage += pd_PrintPage;
            podglad_dia.Document = podgladDruku;
            ((Form)podglad_dia).WindowState = FormWindowState.Maximized;
            podglad_dia.PrintPreviewControl.Zoom = 1.5;
            podglad_dia.ShowDialog();
        }

        private void drukuj_Click(object sender, EventArgs e)
        {
            ZapiszFakture();

            if (oryginal_box.Checked)   //oryginał
            {
                var pd = new PrintDocument();
                _orgKop = 0;
                pd.PrintPage += pd_PrintPage;
                print_dia.Document = pd;
                if (print_dia.ShowDialog() != DialogResult.OK) return;
                try
                {
                    pd.Print();
                }
                catch (Exception ex)
                {
                    Wyjatki.Error(ex);
                }
            }

            ////////////////////////////////

            if (kopia_box.Checked)  //kopia
            {
                var pd = new PrintDocument();
                _orgKop = 1;
                pd.PrintPage += pd_PrintPage;
                print_dia.Document = pd;
                if (print_dia.ShowDialog() != DialogResult.OK) return;
                try
                {
                    pd.Print();
                }
                catch (Exception ex)
                {
                    Wyjatki.Error(ex);
                }
            }
            Close();
        }

        private void pd_PrintPage(object sender, PrintPageEventArgs e)
        {
            Graphics g = e.Graphics;

            const int pozNabX = 480;
            const int pozNabY = 200;

            int lewyMargX = 75;
            const int pozSprzedY = 200;

            //przygotowane do przenoszenia składników na kolejne strony
            //bool fStop = false;

            //DANE NABYWCY
            var reader1D = Baza.Wczytaj1D("SELECT * FROM OSOBY WHERE ID = '" + _id + "'");

            g.DrawString("Nabywca:", Fonty.Normal, Brushes.Black, new PointF(pozNabX - 10, pozNabY - 5));
            g.DrawString(reader1D[1], Fonty.Dane, Brushes.Black, new PointF(pozNabX, pozNabY + 20));
            g.DrawString(reader1D[2], Fonty.Dane, Brushes.Black, new PointF(pozNabX, pozNabY + 40));

            string adres = reader1D[4] + " " + reader1D[5];
            if (!string.IsNullOrWhiteSpace(reader1D[6]))
            {
                g.DrawString(adres += " m." + reader1D[6], Fonty.Dane, Brushes.Black, new PointF(pozNabX, pozNabY + 60));
            }
            g.DrawString(adres, Fonty.Dane, Brushes.Black, new PointF(pozNabX, pozNabY + 60));

            g.DrawString(reader1D[7] + " " + reader1D[3], Fonty.Dane, Brushes.Black, new PointF(pozNabX, pozNabY + 80));
            g.DrawString("NIP: " + reader1D[11], Fonty.Dane, Brushes.Black, new PointF(pozNabX, pozNabY + 100));


            //DANE SPRZEDAWCY
            reader1D = Baza.Wczytaj1D("SELECT * FROM DANE_SPRZEDAWCY");

            g.DrawString("Sprzedawca:", Fonty.Normal, Brushes.Black, new PointF(lewyMargX - 10, pozSprzedY - 5));
            g.DrawString(reader1D[1], Fonty.Dane, Brushes.Black, new PointF(lewyMargX, pozSprzedY + 20));
            g.DrawString(reader1D[2], Fonty.Dane, Brushes.Black, new PointF(lewyMargX, pozSprzedY + 40));
            g.DrawString("ul. " + reader1D[3], Fonty.Dane, Brushes.Black, new PointF(lewyMargX, pozSprzedY + 60));
            g.DrawString(reader1D[4], Fonty.Dane, Brushes.Black, new PointF(lewyMargX, pozSprzedY + 80));
            g.DrawString("NIP: " + reader1D[5], Fonty.Dane, Brushes.Black, new PointF(lewyMargX, pozSprzedY + 100));
            g.DrawString("Regon: " + reader1D[6], Fonty.Dane, Brushes.Black, new PointF(lewyMargX, pozSprzedY + 120));
            g.DrawString("Telefon: " + reader1D[7], Fonty.Normal, Brushes.Black, new PointF(lewyMargX, pozSprzedY + 150));
            g.DrawString("Nr. konta: " + reader1D[8], Fonty.Normal, Brushes.Black, new PointF(lewyMargX, pozSprzedY + 170));

            if (!string.IsNullOrWhiteSpace(reader1D[9]))
            {
                g.DrawImage(Image.FromFile("Loga\\" + reader1D[9]), 50, 140, 150, 50);
            }

            //NR. FAKTURY
            string numerFv = reader1D[10];
            if (!string.IsNullOrWhiteSpace(numerFv)) numerFv += " / ";
            else numerFv = "";

            g.DrawString("Faktura VAT nr: " + _nrF + " / " + numerFv + data_w.Value.Month.ToString("00") + " / " + data_w.Value.Year, Fonty.Naglowek, Brushes.Black, new PointF(50, 100));

            //SKLADANIE DO KOPERTY
            g.DrawLine(Fonty.NormalPen, new PointF(lewyMargX - 20, 390), new PointF(lewyMargX - 15, 390));
            g.DrawLine(Fonty.NormalPen, new PointF(795, 390), new PointF(800, 390));
            g.DrawLine(Fonty.NormalPen, new PointF(lewyMargX - 20, 780), new PointF(lewyMargX - 15, 780));
            g.DrawLine(Fonty.NormalPen, new PointF(795, 780), new PointF(800, 780));

            //DUPLIKAT
            if (duplikat_ch.Checked) g.DrawString("Duplikat z dnia: " + duplikat_c.Value.ToLongDateString(), new Font("Arial", 15, FontStyle.Bold), Brushes.Black, new PointF(lewyMargX, 50));

            //ORYGINAŁ / KOPIA
            g.DrawString(_orgKop == 0 ? "Oryginał" : "Kopia", Fonty.Naglowek, Brushes.Black, new PointF(530, 50));

            //DATY
            g.DrawString("Data wystawienia:", Fonty.Normal, Brushes.Black, new PointF(500, 80));
            g.DrawString(data_w.Value.Day.ToString("00") + " / " + data_w.Value.Month.ToString("00") + " / " + data_w.Value.Year, Fonty.Normal, Brushes.Black, new PointF(650, 80));
            g.DrawString("Data wykonania usługi:", Fonty.Normal, Brushes.Black, new PointF(500, 100));
            g.DrawString(data_w.Value.Day.ToString("00") + " / " + data_w.Value.Month.ToString("00") + " / " + data_w.Value.Year, Fonty.Normal, Brushes.Black, new PointF(650, 100));

            //Sposób i termin
            g.DrawString("Sposób zapłaty: " + metoda.Text, Fonty.Normal, Brushes.Black, new PointF(pozNabX, 350));
            g.DrawString("Termin płatności: " + termin.Text, Fonty.Normal, Brushes.Black, new PointF(pozNabX, 370));

            int pozTowarY = 415;

            //TABELA TOWAROW
            g.DrawString("Lp.", Fonty.Towary, Brushes.Black, new PointF(lewyMargX - 10, pozTowarY));
            g.DrawString("Nazwa", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 20, pozTowarY));
            g.DrawString("PKWiU", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 260, pozTowarY));
            g.DrawString("Cena Netto", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 350, pozTowarY));
            g.DrawString("% VAT", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 450, pozTowarY));
            g.DrawString("Kwota VAT", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 510, pozTowarY));
            g.DrawString("Cena Brutto", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 600, pozTowarY));
            g.DrawLine(Fonty.NormalPen, lewyMargX, 435, 750, 435);

            pozTowarY += 5;

            double sumaNetto = 0;
            double sumaVat = 0;

            if (list_sel.Items.Count > 18)
            {
                Wyjatki.Komunikat("Za dużo składników. Nie mieszczą się na fakturze. Skontaktuj się z autorem oprogramowania.", "Za dużo składników.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                //LISTA TOWAROW
                for (int i = 0; i < list_sel.Items.Count; i++)
                {
                    //if (!fStop)
                    //{
                    pozTowarY = pozTowarY + 20;
                    g.DrawString((i + 1).ToString(), Fonty.Towary, Brushes.Black, new PointF(lewyMargX - 10, pozTowarY));
                    //NAZWA
                    g.DrawString(list_sel.Items[i].SubItems[0].Text, Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 20, pozTowarY));
                    //PKWiU
                    g.DrawString(list_sel.Items[i].SubItems[1].Text, Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 260, pozTowarY));

                    double netto = Convert.ToDouble(list_sel_c.Items[i].SubItems[0].Text);
                    sumaNetto += netto;
                    g.DrawString(String.Format("{0:N2}", netto), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 420, pozTowarY), Fonty.Lewa);

                    if (Int32.Parse(list_sel_c.Items[i].SubItems[1].Text) == 0) g.DrawString("zw", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 470, pozTowarY));
                    else g.DrawString(list_sel_c.Items[i].SubItems[1].Text, Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 470, pozTowarY));

                    double vat = Math.Round(netto * (Convert.ToDouble(list_sel_c.Items[i].SubItems[1].Text) / 100), 2);
                    sumaVat += vat;
                    g.DrawString(String.Format("{0:N2}", vat), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 580, pozTowarY), Fonty.Lewa);

                    g.DrawString(String.Format("{0:N2}", netto + vat), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 670, pozTowarY), Fonty.Lewa);
                    //}
                    //else
                    //{
                    //if (i < 10) e.HasMorePages = true;
                    //}
                }
            }

            //PODSUMOWANIE TOWAROW
            g.DrawLine(Fonty.NormalPen, lewyMargX + 100, pozTowarY + 30, lewyMargX + 700, pozTowarY + 30);
            pozTowarY += 40;
            g.DrawString("Razem:", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 250, pozTowarY));
            g.DrawString(string.Format("{0:N2}", sumaNetto), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 420, pozTowarY), Fonty.Lewa);
            g.DrawString(string.Format("{0:N2}", sumaVat), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 580, pozTowarY), Fonty.Lewa);
            g.DrawString(string.Format("{0:N2}", sumaVat + sumaNetto), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 670, pozTowarY), Fonty.Lewa);

            //WYPISYWANIE POSZCZEGOLNYCH STAWEK VAT
            pozTowarY += 30;
            g.DrawString("W tym:", Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 254, pozTowarY));
            var stawkiVat = new List<int>();

            var reader1Dp = Baza.Wczytaj1Dp("SELECT DISTINCT(VAT) FROM SKLADNIKI WHERE ID IN (SELECT ID_S FROM FAKTURY_SKLADNIKI WHERE ID_F = '" + _idF + "') ORDER BY ABS(VAT);");
            foreach (string x in reader1Dp)
            {
                stawkiVat.Add(Int32.Parse(x));
            }

            foreach (int vat in stawkiVat)
            {
                double sumaCen = 0;
                double sumaCenVat = 0;

                reader1Dp = Baza.Wczytaj1Dp("SELECT Faktury_Skladniki.CENA FROM Faktury_Skladniki JOIN skladniki on Faktury_Skladniki.ID_S = skladniki.ID WHERE Faktury_Skladniki.ID_F = '"
                                 + _idF + "' AND skladniki.VAT  = '" + vat + "'");
                foreach (string sumaS in reader1Dp)
                {
                    double cena = Convert.ToDouble(sumaS.Replace(".", ","));
                    sumaCen += Math.Round(cena, 2);
                    sumaCenVat += Math.Round(cena * vat / 100, 2);
                }

                if (sumaCen != 0)
                {
                    g.DrawString(string.Format("{0:N2}", sumaCen), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 420, pozTowarY), Fonty.Lewa);
                    g.DrawString(vat == 0 ? "zw" : vat.ToString(), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 470, pozTowarY));
                    g.DrawString(string.Format("{0:N2}", sumaCenVat), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 580, pozTowarY), Fonty.Lewa);
                    g.DrawString(string.Format("{0:N2}", sumaCen + sumaCenVat), Fonty.Towary, Brushes.Black, new PointF(lewyMargX + 670, pozTowarY), Fonty.Lewa);
                    pozTowarY += 20;
                }
            }

            //SUMA DO ZAPLATY I KWOTA SLOWNIE
            g.DrawString("Do zapłaty: " + String.Format("{0:N2}", sumaNetto + sumaVat) + " zł", Fonty.Naglowek, Brushes.Black, new PointF(lewyMargX, pozTowarY));
            g.DrawString("Słownie: " + SlownieLiczba(sumaNetto + sumaVat), new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new PointF(lewyMargX, pozTowarY + 30));
            g.DrawString(notka_1.Text, Fonty.Normal, Brushes.Black, new PointF(lewyMargX, pozTowarY + 60));
            g.DrawString(notka_2.Text, Fonty.Normal, Brushes.Black, new PointF(lewyMargX, pozTowarY + 80));

            //MIEJSCA NA PODPISY
            pozTowarY += 170;
            lewyMargX += 10;

            g.DrawString(".............................................", Fonty.Normal, Brushes.Black, new PointF(lewyMargX, pozTowarY));
            g.DrawString("Podpis osoby upoważnionej", Fonty.Mala, Brushes.Black, new PointF(lewyMargX + 15, pozTowarY + 20));
            g.DrawString("do wystawienia faktury", Fonty.Mala, Brushes.Black, new PointF(lewyMargX + 25, pozTowarY + 40));

            g.DrawString(".............................................", Fonty.Normal, Brushes.Black, new PointF(580, pozTowarY));
            g.DrawString("Podpis osoby upoważnionej", Fonty.Mala, Brushes.Black, new PointF(580 + 15, pozTowarY + 20));
            g.DrawString("do otrzymania faktury", Fonty.Mala, Brushes.Black, new PointF(580 + 25, pozTowarY + 40));
        }

        private void add_Click(object sender, EventArgs e)
        {
            try
            {
                if (list_all.Items.Count > 0)
                {
                    list_sel.Items.Add((ListViewItem)list_all.SelectedItems[0].Clone());
                    ListViewItem element = list_sel_c.Items.Add(list_all.SelectedItems[0].SubItems[2].Text);
                    element.SubItems.Add(list_all.SelectedItems[0].SubItems[3].Text);
                    element.SubItems.Add("0,00");
                    element.SubItems.Add(list_all.SelectedItems[0].SubItems[4].Text);
                    LiczBrutto();
                }
            }
            catch
            {
                list_all.Items[0].Selected = true;
                list_sel.Items[0].Selected = true;
                list_sel_c.Items[0].Selected = true;

                add_Click(this, EventArgs.Empty);
            }
        }

        private void rem_Click(object sender, EventArgs e)
        {
            try
            {
                if (list_sel.Items.Count > 0)
                {
                    int indexTmp = list_sel.SelectedItems[0].Index;

                    list_sel_c.Items.Remove(list_sel_c.Items[list_sel.SelectedItems[0].Index]);
                    list_sel.Items.Remove(list_sel.SelectedItems[0]);

                    if (indexTmp < list_sel.Items.Count)
                    {
                        list_sel.Items[indexTmp].Selected = true;
                        list_sel_c.Items[indexTmp].Selected = true;
                    }
                    else
                    {
                        list_sel.Items[list_sel.Items.Count - 1].Selected = true;
                        list_sel_c.Items[list_sel.Items.Count - 1].Selected = true;
                    }
                }
            }
            catch
            {
                list_all.Items[0].Selected = true;
                list_sel.Items[0].Selected = true;
                list_sel_c.Items[0].Selected = true;

                rem_Click(this, EventArgs.Empty);
            }
        }

        private void up_Click(object sender, EventArgs e)
        {
            if (list_sel.SelectedItems.Count > 0)
            {
                int indexTmp = list_sel.SelectedItems[0].Index;

                try
                {
                    if (indexTmp > 0)
                    {
                        ListViewItem el = list_sel.Items[indexTmp];
                        list_sel.Items.Remove(el);
                        list_sel.Items.Insert(indexTmp - 1, el);

                        el = list_sel_c.Items[indexTmp];
                        list_sel_c.Items.Remove(el);
                        list_sel_c.Items.Insert(indexTmp - 1, el);
                    }
                }
                catch (Exception ex)
                {
                    Wyjatki.Error(ex);
                }
            }
        }

        private void down_Click(object sender, EventArgs e)
        {
            if (list_sel.SelectedItems.Count > 0)
            {
                int indexTmp = list_sel.SelectedItems[0].Index;

                try
                {
                    if (indexTmp < list_sel.Items.Count - 1)
                    {
                        ListViewItem el = list_sel.Items[indexTmp];
                        list_sel.Items.Remove(el);
                        list_sel.Items.Insert(indexTmp + 1, el);

                        el = list_sel_c.Items[indexTmp];
                        list_sel_c.Items.Remove(el);
                        list_sel_c.Items.Insert(indexTmp + 1, el);
                    }
                }
                catch (Exception ex)
                {
                    Wyjatki.Error(ex);
                }
            }
        }

        private void skladniki_Click(object sender, EventArgs e)
        {
            ZapiszFakture();
            new OsobySkladniki().ShowDialog();
            Wyswietl();
        }

        private void duplikat_ch_CheckedChanged(object sender, EventArgs e)
        {
            duplikat_c.Enabled = duplikat_ch.Checked;
        }

        private void list_sel_c_AfterLabelEdit(object sender, LabelEditEventArgs e)
        {
            list_sel_c.BeginInvoke(new MethodInvoker(LiczBrutto));
        }

        private void list_sel_c_DoubleClick(object sender, EventArgs e)
        {
            list_sel_c.SelectedItems[0].BeginEdit();
        }
        #endregion handlery
    }
}
